package com.srv.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import com.srv.exceptions.EnderecoInvalidoException;
import com.srv.pojo.Pagina;
import com.srv.pojo.Usuario;

public class DAOUsuario extends DAOGenerico implements DAOGenericoInterface {

	public DAOUsuario() throws ClassNotFoundException, SQLException {
		super();
	}

	public Integer verificaLogin(Usuario usuario) {
		try {
			// Exercicio1Vo ex1 = new Exercicio1Vo();

			// List<Exercicio1Vo> exercicio1 = new ArrayList<Exercicio1Vo>();

			PreparedStatement stmt = this
					.getConnection()
					.prepareStatement(
							"select count(email) as total from usuario where email=? and senha=? ");
			stmt.setString(1, usuario.getEmail());
			stmt.setString(2, usuario.getSenha());
			ResultSet rs = stmt.executeQuery();

			rs.next();

			Integer total = rs.getInt("total");

			rs.close();
			stmt.close();
			return total;
		} catch (Exception e) {
			System.out.println(e.getMessage());
			return 0;
		}
	}

	@Override
	public void insert(Object object) throws Exception {
		Connection connection = this.getConnection();
		Statement st = connection.createStatement();
		Usuario usuario = (Usuario) object;
		DAOEndereco daoEndereco = new DAOEndereco();
		/*
		 * Adicionada condicional para evitar que seja lançado um erro pelo SQL
		 * pois, caso um endereço que não exista seja passado para a camada de
		 * persistência, ocorrerá um erro não tratado.
		 */
		if (!daoEndereco.existEndereco(usuario.getEndereco())) {
			throw new EnderecoInvalidoException(
					"O endereço indicado não está cadastrado na base de dados!");
		}
		String cmdInsert = "INSERT INTO usuario(email, senha, ativo, complemento, cpf, numero_endereco, fone1, fone2, nascimento, nome, rg, endcode) VALUES ('"
				+ usuario.getEmail() + "','"
				+ usuario.getSenha() + "',"
				+ 1 + ",'"
				+ usuario.getComplemento() + "','"
				+ usuario.getCpf() + "',"
				+ usuario.getEnderecoNumero() + ",'"
				+ usuario.getFone1() + "','"
				+ usuario.getFone2() + "','"
				+ new SimpleDateFormat("yyyy-MM-dd").format(usuario.getNascimento()) + "','"
				+ usuario.getNome()	+ "','"
				+ usuario.getRg() + "',"
				+ usuario.getEndereco().getEndcode() + ");";
		st.executeUpdate(cmdInsert);
		st.close();
	}

	@Override
	public void update(Object object) throws Exception {
		Connection connection = this.getConnection();
		Statement st = connection.createStatement();
		Usuario usuario = (Usuario) object;
		DAOEndereco daoEndereco = new DAOEndereco();
		/*
		 * Adicionada condicional para evitar que seja lançado um erro pelo SQL
		 * pois, caso um endereço que não exista seja passado para a camada de
		 * persistência, ocorrerá um erro não tratado.
		 */
		String cmdUpdate = "UPDATE usuario SET ";
		if (!daoEndereco.existEndereco(usuario.getEndereco())) {
			throw new EnderecoInvalidoException(
					"O endereço indicado não está cadastrado na base de dados!");
		}
		cmdUpdate.concat("senha = '" + usuario.getSenha() + "'," + "ativo = " + 1
				+ "," + "complemento = '" + usuario.getComplemento() + "',"
				+ "cpf = '" + usuario.getCpf() + "'," + "numero_endereco = "
				+ usuario.getEnderecoNumero() + "," + "fone1 = '"
				+ usuario.getFone1() + "'," + "fone2 = '" + usuario.getFone2()
				+ "'," + "nascimento = '" + usuario.getNascimento() + "',"
				+ "nome = '" + usuario.getNome() + "'," + "rg = '"
				+ usuario.getRg() + "'," + "endcode = "
				+ usuario.getEndereco().getEndcode() + ")");

		cmdUpdate.concat(" WHERE email = '" + usuario.getEmail() + "';");
		st.executeUpdate(cmdUpdate);
		st.close();
	}

	@Override
	public void delete(Object object) throws Exception {
		throw new Exception("Operação não permitida!");
	}

	public List<Usuario> getUsuarioList() throws SQLException,
			ClassNotFoundException {
		ResultSet rs = this
				.getResultSet("SELECT u.ativo, u.complemento, u.nome, u.cpf, u.rg, u.email, u.numero_endereco, u.nascimento, u.fone1, u.fone2, u.login, u.senha FROM usuario u");
		List<Usuario> usuarioList = new ArrayList<Usuario>();
		DAOEndereco daoEndereco = new DAOEndereco();
		Usuario usuario = null;
		while (rs.next()) {
			usuario = new Usuario();
			usuario.setAtivo(rs.getBoolean("ativo"));
			usuario.setComplemento(rs.getString("complemento"));
			usuario.setNome(rs.getString("nome"));
			usuario.setCpf(rs.getString("cpf"));
			usuario.setRg(rs.getString("rg"));
			usuario.setEmail(rs.getString("email"));
			usuario.setEndereco(daoEndereco.getEnderecoByCep("cep"));
			usuario.setEnderecoNumero(Integer.parseInt(rs
					.getString("numero_endereco")));
			usuario.setNascimento(rs.getDate("nascimento"));
			usuario.setFone1(rs.getString("fone1"));
			usuario.setFone1(rs.getString("fone2"));
			usuario.setSenha(rs.getString("senha"));
		}
		rs.close();
		return usuarioList;
	}

	public Usuario getUsuarioByLogin(String login) throws SQLException,
			ClassNotFoundException {
		ResultSet rs = this
				.getResultSet("SELECT u.ativo, u.complemento, u.nome, u.cpf, u.rg, u.email, u.numero_endereco, u.nascimento, u.fone1, u.fone2, u.senha FROM usuario u WHERE u.email LIKE '"
						+ login +"'");
		//DAOEndereco daoEndereco = new DAOEndereco();
		Usuario usuario = new Usuario();
		while (rs.next()) {
			usuario.setAtivo(rs.getBoolean("ativo"));
			usuario.setComplemento(rs.getString("complemento"));
			usuario.setNome(rs.getString("nome"));
			usuario.setCpf(rs.getString("cpf"));
			usuario.setRg(rs.getString("rg"));
			usuario.setEmail(rs.getString("email"));
			usuario.setComplemento(rs.getString("complemento"));
			//usuario.setEndereco(daoEndereco.getEnderecoByCep("cep"));
			usuario.setEnderecoNumero(rs.getInt("numero_endereco"));
			usuario.setNascimento(rs.getDate("nascimento"));
			usuario.setFone1(rs.getString("fone1"));
			usuario.setFone1(rs.getString("fone2"));
			usuario.setSenha(rs.getString("senha"));
		}
		rs.close();
		return usuario;
	}

	public Usuario getByLoginAndSenha(String login, String senha)
			throws SQLException, ClassNotFoundException {
		ResultSet rs = this
				.getResultSet("SELECT u.ativo, u.complemento, u.nome, u.cpf, u.rg, u.email, u.cep, u.numero_endereco, u.nascimento, u.fone1, u.fone2, u.login, u.senha FROM usuario u WHERE u.login = "
						+ login + " AND senha = " + senha);
		DAOEndereco daoEndereco = new DAOEndereco();
		Usuario usuario = new Usuario();
		while (rs.next()) {
			usuario.setAtivo(rs.getBoolean("ativo"));
			usuario.setComplemento(rs.getString("complemento"));
			usuario.setNome(rs.getString("nome"));
			usuario.setCpf(rs.getString("cpf"));
			usuario.setRg(rs.getString("rg"));
			usuario.setEmail(rs.getString("email"));
			usuario.setComplemento(rs.getString("complemento"));
			usuario.setEndereco(daoEndereco.getEnderecoByCep("cep"));
			usuario.setEnderecoNumero(rs.getInt("numero_endereco"));
			usuario.setNascimento(rs.getDate("nascimento"));
			usuario.setFone1(rs.getString("fone1"));
			usuario.setFone1(rs.getString("fone2"));
			usuario.setSenha(rs.getString("senha"));
		}
		rs.close();
		return usuario;
	}
	
	public boolean existeUsuario(Usuario usuario) throws Exception{
		ResultSet rs = this.getResultSet("SELECT 1 as existe FROM usuario u WHERE u.email = '" + usuario.getEmail() +"';");
		while (rs.next()){
			if (rs.getInt("existe")==1){
				rs.close();
				return true;
			}
		}
		rs.close();
		return false;
	}
	
	public List<Pagina> getListaPaginas(Usuario usuario) throws Exception{
		ResultSet rs = this.getResultSet("SELECT pacode, desc_pagina " +
				"FROM usuario u, perfil pe, perfil_pagina pp, pagina pa " + 
				"WHERE u.email = '" + usuario.getEmail() +"' " +
				"AND u.pecode = pe.pecode " + 
				"AND pe.pecode = pp.pecode " +
				"AND pp.pecode = pa.pacode;");
		List<Pagina> listaPaginas = new ArrayList<Pagina>();
		Pagina pagina = null;
		while (rs.next()){
			pagina = new Pagina();
			pagina.setPacode(rs.getInt("pacode"));
			pagina.setDescPagina(rs.getString("desc_pagina"));
			listaPaginas.add(pagina);
		}
		return listaPaginas;
	}
}
